package com.ray.mapper;

import java.util.ArrayList;
import java.util.List;
import java.util.Map;

import org.apache.ibatis.annotations.Param;

import com.ray.bean.AttendApprovalLeaveBean;
import com.ray.bean.AttendApprovalOvertimeBean;
import com.ray.bean.AttendApprovalProcessBean;
import com.ray.bean.AttendApprovalProcessUniteBean;
import com.ray.bean.AttendClassTailBean;
import com.ray.bean.AttendDeviceTransBean;
import com.ray.bean.AttendOvertimeRuleBean;
import com.ray.bean.AttendPlanBean;
import com.ray.bean.AttendanceClassBean;
import com.ray.bean.AttendanceGroupBean;
import com.ray.bean.AttendanceRewardAndPunishBean;
import com.ray.bean.DepartmentBean;
import com.ray.bean.PersonBean;
import com.ray.bean.ReimburseBean;
import com.ray.pojo.AttendApplicationDetailInfoPojo;
import com.ray.pojo.AttendDevicePojo;
import com.ray.pojo.AttendQueryDailyStatisticsPojo;
import com.ray.pojo.AttendSourceRecordPojo;
import com.ray.pojo.QuerySummaryBodyPojo;
import com.ray.pojo.attend.AskForApproverPojo;
import com.ray.pojo.attend.AttendanceApprovalInfoPojo;
import com.ray.pojo.attend.ClockTimePojo;
import com.ray.pojo.attend.FillcardApplicationPojo;
import com.ray.pojo.attend.LeaveApplicationPojo;
import com.ray.pojo.attend.OvertimeApplicationPojo;
import com.ray.pojo.attend.UserFinancePojo;

public interface DingTalkMapper {
	
	void insertGroup(Map<String,Object> map);
	

	//根据日期查询钉钉考勤数据
	List<AttendSourceRecordPojo> queryAttendance(Map<String,Object> map);
	
	
	//查询钉钉考勤数据的数量
	int queryAttendanceCount(Map<String,Object> map);
	
	//根据日期查询钉钉考勤数据无效打卡时间
	List<AttendSourceRecordPojo> queryAttendanceInvalid(Map<String,Object> map);
	
	//查询钉钉考勤数据的数量无效打卡时间
	int queryAttendanceInvalidCount(Map<String,Object> map);
	
	//插入班次
	void insertClass(@Param("attendanceClass")AttendanceClassBean attendanceClass);

	//查询班次
	List<AttendanceClassBean> queryClass(Map<String,Object> map);
	
	//查询班次数量
	int queryClassCount(Map<String,Object> map);

	//根据使用者公司获取班次名称，避免重复插入
	List<String> queryClassName(@Param("company")String company);

	//删除对应公司的班次
	void deleteClass(@Param("company")String company, @Param("id")String id);

	//修改班次
	void updateClass(@Param("attendanceClass")AttendanceClassBean attendanceClass);
	
	//查询部门数量
	int queryDeptCount(Map<String,Object> map);
	
	//查询部门
	List<DepartmentBean> queryDept(Map<String,Object> map);

	//查询部门的人员名称
	List<PersonBean> getPersonName(Map<String,Object> map);

	//查询部门人员数量
	int getPersonNameCount(Map<String,Object> map);

	int queryGroupCount(Map<String,Object> map);

	List<AttendanceGroupBean> queryGroup(Map<String,Object> map);

	int selectCountById(@Param("deptId")String deptId);

	String selectClassById(@Param("classId")String classId);
	/**  
	 * Title: updateUserGroupId
	 * Description: 修改考勤组信息时，同时修改用户表的groupId  
	 * @param attendanceGroupBean  
	 * @author 王荣
	 * @date 2018年4月23日 下午1:18:28
	 */ 
	void updateUserGroupId(Map<String,Object> map);
	
	void updateGroup(Map<String,Object> map);

	void deleteGroup(@Param("id")String id);

	List<AttendanceGroupBean> getGroupDetail(@Param("id")String id);

	List<String> getGroupName(@Param("groupIds")String groupIds);

	void insertAttendanceRewardAndPunish(AttendanceRewardAndPunishBean rewardAndPunish);

	void updateAttendanceRewardAndPunish(AttendanceRewardAndPunishBean rewardAndPunish);

	List<AttendanceRewardAndPunishBean> getRewardAndPunishInfo(Map<String,Object> map);

	void deleteRewardAndPunish(AttendanceRewardAndPunishBean rewardAndPunish);
	/**  
	 * Title: getUserAttendInfo
	 * Description: 获取用户某天的考勤信息  
	 * @param map
	 * @return  
	 * @author 王荣
	 */ 
	com.ray.pojo.UserAttendInfoPojo getUserAttendInfo(Map<String,Object> map);

	/**  
	 * Title: updateApproval
	 * Description: 修改补卡审批  
	 * @param map  
	 * @author 王荣
	 */ 
	void updateApproval(Map<String,Object> map);

	/**  
	 * Description: 获取补卡审批人员（该职员所属部门的部门经理） 
	 * @param map
	 * @return List<PersonBean>
	 * @author 王荣
	 */ 
	List<PersonBean> getFillCardApprover(Map<String,Object> map);

	/**  
	 * 获取考勤排班信息，当前时间,用于发送打卡提醒消息
	 * @author 王荣
	 */ 
	List<AttendPlanBean> getAttendPlan();
	
	List<Map<String,Object>> checkForTimeOverlap(Map<String,Object> map);
	/**  
	 * Title: submitLeaveApplication
	 * Description: 提交请假单  
	 * @param map  
	 * @author 王荣
	 */ 
	void submitLeaveApplication(Map<String,Object> map);

	/**  
	 * Title: askForApprover
	 * Description: TODO(这里用一句话描述这个方法的作用)  
	 * @param map
	 * @return  
	 * @author 王荣
	 */ 
	List<AskForApproverPojo> askForApprover(Map<String,Object> map);

	/**  
	 * Title: addApprovalProcess
	 * Description: TODO(这里用一句话描述这个方法的作用)  
	 * @param map  
	 * @author 王荣
	 */ 
	void addApprovalProcess(Map<String,Object> map);

	/**  
	 * Title: findApprovalProcess
	 * Description: TODO(这里用一句话描述这个方法的作用)  
	 * @param map
	 * @return  
	 * @author 王荣
	 */ 
	List<AttendApprovalProcessBean> findApprovalProcess(Map<String,Object> map);

	/**  
	 * Title: queryApprovalProcessSetCount
	 * Description: TODO(这里用一句话描述这个方法的作用)  
	 * @param map
	 * @return  
	 * @author 王荣
	 */ 
	int queryApprovalProcessSetCount(Map map);

	/**  
	 * Title: queryApprovalProcessSet
	 * Description: TODO(这里用一句话描述这个方法的作用)  
	 * @param map
	 * @return  
	 * @author 王荣
	 */ 
	List<AttendApprovalProcessBean> queryApprovalProcessSet(Map<String,Object> map);

	/**  
	 * Title: addAndDeleteApprovalProcess
	 * Description: TODO(这里用一句话描述这个方法的作用)  
	 * @param map  
	 * @author 王荣
	 */ 
	void addAndDeleteApprovalProcess(Map<String,Object> map);

	/**  
	 * Title: deleteApprovalProcessSet
	 * Description: TODO(这里用一句话描述这个方法的作用)  
	 * @param map  
	 * @author 王荣
	 */ 
	void deleteApprovalProcessSet(Map<String,Object> map);

	/**  
	 * Title: getUserWorkingPlan
	 * Description: TODO(这里用一句话描述这个方法的作用)  
	 * @param map
	 * @return  
	 * @author 王荣
	 */ 
	com.ray.pojo.attend.UserWorkPlanPojo getUserWorkingPlan(Map<String,Object> map);

	/**
	 * Title: getApprovalNo
	 * Description: 获取自增长的审批编号  QJ:请假
	 * @param prefix:前缀
	 * @return  String 前缀+编号
	 * @author 王荣
	 */ 
	String getApprovalNo(@Param("prefix") String prefix);

	/**   
	 * 获取请假审批信息
	 * @param map
	 * @return List<AttendApprovalLeaveBean>
	 * @author 王荣
	 */ 
	List<AttendApprovalLeaveBean> getApprovalProcessInfo(Map<String,Object> map);

	/**  
	 * Title: updateAttendApproval
	 * Description: TODO(这里用一句话描述这个方法的作用)  
	 * @param map  
	 * @author 王荣
	 */ 
	void updateAttendApproval(Map map);

	/**  
	 * Title: getApprovalInfoById
	 * Description: TODO(这里用一句话描述这个方法的作用)  
	 * @param map
	 * @return  
	 * @author 王荣
	 */ 
	AttendApprovalLeaveBean getApprovalInfoById(Map map);

	/**  
	 * Title: getApprovalCopyforInfo
	 * Description: TODO(这里用一句话描述这个方法的作用)  
	 * @param map
	 * @return  
	 * @author 王荣
	 */ 
	List<AttendApprovalLeaveBean> getApprovalCopyforInfo(Map map);

	/**  
	 * Description: 修改职员工资明细
	 * @param map  
	 * @author 王荣
	 */ 
	void updateFinanceDetail(Map<String,Object> map);

	/**  
	 * Title: selectRewardAndPunishInfo
	 * Description: TODO(这里用一句话描述这个方法的作用)  
	 * @param map
	 * @return  
	 * @author 王荣
	 */ 
	List<Map<String, String>> selectRewardAndPunishInfo(Map map);

	/**
	 * 月度汇总关联查询请假审批信息
	 * @param requestParam
	 * @return
	 * @author 王荣
	 */
	List<Map<String, Object>> getSummaryLeaveApprovalInfo(Map<String, Object> requestParam);
	/**
	 * Description: 查询月度汇总 
	 * @return List<QuerySummaryBodyPojo>
	 * @author 王荣
	 */
	List<QuerySummaryBodyPojo> querySummaryBody(Map<String,Object> map);
	/**
	 * 获取可选取的参与人员的信息：部门、车间、姓名
	 * @param map
	 * @return
	 * @author 王荣
	 */
	List<Map<String,String>> getParticipantInfo(Map<String,String> map);
	/**
	 * 检查补卡申请是否重复
	 * @param map
	 * @return
	 * @author 王荣
	 */
	List<Map<String,Object>> checkAttendApprovalFillcardRepeat(Map<String,Object> map);
	/**
	 * 插入考勤补卡审批记录
	 * @param map
	 * @author 王荣
	 */
	void insertAttendApprovalFillcard(Map<String,Object> map);
	/**
	 * 查询所有类型的审批单
	 * @return
	 * @author 王荣
	 */
	List<Map<String,Object>> getMyApprovalList(Map<String,Object> map);
	int getMyApprovalListCount(Map<String, Object> map);
	/**
	 * 获取审批单详情
	 * @param map 
	 * @return AttendApplicationDetailInfoPojo
	 * @author 王荣
	 */
	AttendApplicationDetailInfoPojo getApplicationDetailInfo(Map<String,Object> map);
	/**
	 * 根据userId获取userName、openid
	 * @param map
	 * @return
	 * @author 王荣
	 */
	Map<String,Object> getUserNameAndOpenIdByUserId(Map<String,Object> map);
	/**
	 * 补卡成功后添加打卡数据
	 * @param map
	 * @author 王荣
	 */
	void insertFillcardRecord(Map<String,Object> map);
	/**
	 * 查询每日统计
	 * @param map
	 * @return
	 * @author 王荣
	 */
	List<AttendQueryDailyStatisticsPojo> queryDailyStatistics(Map<String,Object> map);
	int queryDailyStatisticsCount(Map<String,Object> map); 
	/**
	 * 查询考勤设备信息
	 * @param map
	 * @return List<AttendDevicePojo>
	 * @author 王荣
	 */
	List<AttendDevicePojo> queryAttendDevice(Map<String,Object> map);
	int queryAttendDeviceCount(Map<String,Object> map);
	/**
	 * 检查考勤设备（设备编号、设备名称）是否重复
	 * @param map
	 * @return List<Map<String,Object>>
	 * @author 王荣
	 */
	List<Map<String,Object>> checkAttendDeviceRepeat(Map<String,Object> map);
	/**
	 * 添加考勤设备
	 * @param map
	 * @author 王荣
	 */
	void insertAttendDevice(Map<String,Object> map);
	/**
	 * 删除考勤机，实则修改enabled为0
	 * @param map
	 * @author 王荣
	 */
	void deleteAttendDevice(Map<String,Object> map);
	/**
	 * 修改考勤机名称
	 * @param map
	 * @author 王荣
	 */
	void updateAttendDevice(Map<String,Object> map);
	/**
	 * 获取考勤机设备信息
	 * @param map
	 * @return
	 * @author 王荣
	 */
	List<AttendDevicePojo> getAttendDevice(Map<String,Object> map);
	/**
	 * 删除考勤机设备user
	 * @param map
	 * @author 王荣
	 */
	void insertDeviceTrans(Map<String, Object> map);
	/**
	 * 添加考勤机设备user指令
	 * @param map
	 * @author 王荣
	 */
	void insertDeviceUser(Map<String, Object> map);
	/**
	 * 获取考勤机中已存在的用户
	 * @param map
	 * @return
	 * @author 王荣
	 */
	List<Map<String,Object>> getAttendDeviceUsers(Map<String,Object> map);
	/**
	 * 修改设备管理员
	 * @param map
	 * @author 王荣
	 */
	void insertAttendDeviceManager(Map<String, Object> map);
	void deleteAttendDeviceManager(Map<String, Object> map);
	/**
	 * 获取设备管理员
	 * @param map
	 * @return
	 * @author 王荣
	 */
	List<Map<String,Object>> getDeviceManager(Map<String,Object> map);
	/**
	 * 设置考勤机管理员
	 * @param map
	 * @author 王荣
	 */
	void insertAttendDeviceManagerCmd(Map<String,Object> map);
	/**
	 * 批量插入打卡机命令
	 * @param list
	 * @author 王荣
	 */
	void batchInsertDeviceCmd(List<AttendDeviceTransBean> list);
	
	List<Integer> selectAttendDeviceUserList(String userId);
	void deleteAttendDeviceUser(List<AttendDeviceTransBean> list);
	void insertAttendDeviceUser(List<AttendDeviceTransBean> list);
	/**
	 * 查询请假审批记录
	 * @param map
	 * @return
	 * @author 王荣
	 */
	List<LeaveApplicationPojo> queryLeaveApplicationRecord(Map<String, Object> map);
	int queryLeaveApplicationRecordCount(Map<String, Object> map);
	/**
	 * 查询补卡审批记录
	 * @param map
	 * @return
	 * @author 王荣
	 */
	List<FillcardApplicationPojo> queryFillcardApplicationRecord(Map<String, Object> map);
	int queryFillcardApplicationRecordCount(Map<String, Object> map);
	/**
	 * 获取打卡时间信息
	 * @param map
	 * @return
	 * @author 王荣
	 */
	List<ClockTimePojo> queryClockTime(Map<String, Object> map);
	int queryClockTimeCount(Map<String, Object> map);
	/**
	 * 获取需要修改的考勤组按月排班计划
	 * @param map
	 * @return List<Map<String, Object>>
	 * @author 王荣
	 */
	List<com.ray.pojo.attend.GroupMonthlyPlanPojo> getGroupMonthlyPlan(Map<String, Object> map);
	/**
	 * 操作考勤组按月排班计划，添加或修改
	 * @param map
	 * @return
	 * @author 王荣
	 */
	void operationAttendGroupMonthlyClass(Map<String, Object> map);
	/**
	 * 保存考勤加班规则
	 * @param requestParam
	 * @author 王荣
	 */
	void saveAttendOvertimeRule(Map<String, Object> requestParam);
	/**
	 * 添加修改之前检查加班规则是否重复
	 * @param requestParam
	 * @return
	 * @author 王荣
	 */
	List<Map<String, Object>> checkOvertimeRuleNameRepeat(Map<String, Object> requestParam);
	/**
	 * 查询考勤加班规则
	 * @param requestParam
	 * @return
	 * @author 王荣
	 */
	List<com.ray.pojo.attend.OvertimeRulePojo> queryAttendOvertimeRule(Map<String, Object> requestParam);
	int queryAttendOvertimeRuleCount(Map<String, Object> requestParam);
	/**
	 * 删除加班规则
	 * @param requestParam
	 * @author 王荣
	 */
	void deleteAttendOvertimeRule(Map<String, Object> requestParam);
	/**
	 * 修改加班规则
	 * @param requestParam
	 * @author 王荣
	 */
	void updateAttendOvertimeRule(Map<String, Object> requestParam);
	/**
	 * 检查加班审批时间是否重复
	 * @param requestParam
	 * @return
	 * @author 王荣
	 */
	List<Map<String, Object>> checkOvertimeRepeat(Map<String, Object> requestParam);
	/**
	 * 保存加班审批单
	 * @param requestParam
	 * @author 王荣
	 */
	void saveOvertimeApplication(AttendApprovalOvertimeBean bean);
	
	void insertAttendProcess(Map<String, Object> map);
	void updateAttendProcess(Map<String, Object> map);
	/**
	 * 修改考勤审批单状态
	 * @param map
	 * @author 王荣
	 */
	void updateAttendApprovalState(Map<String, Object> map);
	/**
	 * 修改加班审批单状态
	 * @param map
	 * @author 王荣
	 */
	void updateAttendOvertimeApproval(Map<String, Object> map);
	
	/**
	 * 获取用户工作时间表
	 * @param requestParam
	 * @return
	 * @author 王荣
	 */
	com.ray.pojo.attend.UserWorkPlanPojo getUserWorkSchedule(Map<String, Object> requestParam);
	
	/**
	 * 获取加班规则
	 * @param requestParam
	 * @author 王荣
	 */
	List<AttendOvertimeRuleBean> getOvertimeRule(Map<String, Object> requestParam);
	
	/**
	 * 加班审批信息
	 * @param id
	 * @return
	 * @author 王荣
	 */
	AttendanceApprovalInfoPojo getOvertimeApprovalDetail(String id);
	
	/**
	 * 请假审批信息
	 * @param id
	 * @return
	 * @author 王荣
	 */
	AttendanceApprovalInfoPojo getLeaveApprovalDetail(String id);
	
	/**
	 * 补卡审批信息
	 * @param id
	 * @return
	 * @author 王荣
	 */
	AttendanceApprovalInfoPojo getFillcardApprovalDetail(String id);
	
	/**
	 * 补卡审批同意时，保存生成的打卡记录到补卡审批记录
	 * @param map
	 * @author 王荣
	 */
	void saveFillcardClockId(Map<String, Object> map);
	
	/**
	 * 补卡撤销时，根据补卡审批记录的clock_id删除对应的打卡记录
	 * @param map
	 * @author 王荣
	 */
	void deleteClockRecordByClockId(Map<String, Object> map);
	
	/**
	 * 获取用户考勤明细信息 社保、公积金...
	 * @param map
	 * @author 王荣
	 */
	List<UserFinancePojo> getUserFinanceDetail(Map<String, Object> map);
	
	/**
	 * 查询加班审批记录
	 * @param map
	 * @author 王荣
	 */
	int queryOvertimeApplicationRecordCount(Map<String, Object> map);
	List<OvertimeApplicationPojo> queryOvertimeApplicationRecord(Map<String, Object> map);

	/**
	 * 保存外出打卡
	 * @param requestMap
	 * @return
	 */
	int saveDataOutSide(Map<String, Object> requestMap);
	int saveDataOutSideBySelf(Map<String, Object> requestMap);

	/**
	 * 插入报销审批记录
	 * @param map
	 * @author 王荣
	 */
	void insertReimburse(Map<String, Object> map);

	/**
	 * 更新报销审批
	 * @param map
	 */
	void updateReimburseApproval(Map<String, Object> map);

	/**
	 * 报销列表
	 * @param map
	 * @return
	 */
	List<Map> queryReimburseRecord(Map<String, Object> map);

	/**
	 * 报销列表数量
	 * @param map
	 * @return
	 */
	Map<String,Object> queryReimburseRecordCount(Map<String, Object> map);

	/**
	 * 插入行政处罚记录
	 * @param map
	 * @author 王荣
	 */
	void insertAdministrativePenalty(Map<String, Object> map);

	/**
	 * 更新行政处罚审批
	 * @param map
	 */
	void updateAdministrativePenaltyApproval(Map<String, Object> map);

	/**
	 *行政处罚列表数量
	 * @param map
	 * @return
	 */
	int queryAdministrativePenaltyCount(Map<String, Object> map);

	/**
	 * 行政处罚列表
	 * @param map
	 * @return
	 */
	List<Map> queryAdministrativePenaltyRecord(Map<String, Object> map);


	void insertAttendClassTail(@Param("beans")List<AttendClassTailBean> beans,@Param("map")Map<String, Object> map);


	List<AttendClassTailBean> getAttendClassTail(Map<String, Object> map);
	
	/**
	 * 查询相应时间打卡数据无效时间表
	 */
	List<Map<String, Object>> getInvalidClockTime(Map<String, Object> map);

	/**
	 * 将无效打卡时间移动到无效打卡时间表
	 * @param map
	 */
	void removeClockRecordToInvalidClockTime(Map<String, Object> map);

	/**
	 * 查询固定审批
	 * @param map
	 * @return
	 */
	List<AttendApprovalProcessUniteBean> queryApprovalProcessSetForUnite(Map<String, Object> map);

	/**
	 * 保存固定审批
	 * @param map
	 */
	void insertApprovalProcessSetForUnite(Map<String, Object> map);


	int queryApprovalProcessSetForUniteCount(Map<String, Object> map);

	/**
	 * 获取行政奖励处罚每个月合计view
	 * @param userId
	 * @param workdate
	 * @param penaltyType
	 * @return
	 */
	Double getViewAdministrativePenalty(@Param("userId")Integer userId, @Param("workdate")String workdate, @Param("penaltyType")int penaltyType);

	/**
	 * 保存加班申请消息
	 * @param requestMap
	 * @return
	 */
	int saveOvertime(Map<String, Object> requestMap);

	/**
	 * 通过guid获取考勤机信息
	 * @param guid
	 * @return
	 */
	List<Map<String, Object>> getDeviceByGuid(@Param("guid")String guid,@Param("company") String company);

	/**
	 * 
	 * @param personId
	 * @return
	 */
	List<AttendDevicePojo> selectAttendDeviceListByUserId(@Param("userId")String userId);
	
}
